/*
 * @Author: lei
 * @Description: 演示thread对象的构造，需要 可调用对象 ；
 * @FilePath: /code/concurrency/thread2.cc
 */

#include <thread>
#include <iostream>
#include <string>
#include <utility>//std::move()
#include <functional>//std::ref()

void print(int i,std::string s)
{
    while(i--)
        std::cout<<s<<std::endl;
}
class A
{
public:
    void f(int x,char c){}
    int operator()(int n){return 0;}
};
void func(int x){}

int main()
{
    A a;

    std::thread th1(a,6);//th1线程运行函数为 对象a的一个拷贝a1的仿函数，即a1() 
    std::thread th2(std::ref(a),6);//th2线程运行函数为 对象a的仿函数，即a()
    std::thread th3([](int x){std::cout<<x<<std::endl;},6);//th3线程的运行函数为 一个lambda匿名函数
    std::thread th4(A(),6);//th4线程运行函数为 一个临时（匿名）对象的拷贝的仿函数
    std::thread th5(func,6);//th5线程运行函数为 一个普通全局函数
    std::thread th6(&A::f,a,4,'x');//th6线程运行函数为 对象a的拷贝a1的成员函数f
    std::thread th7(&A::f,&a,4,'x');//th7线程运行函数为 对象a的成员函数f
    std::thread th8(std::move(a),6);//th8线程运行函数为 对象a的仿函数，即a()；但是a在main线程中不再可用，它属于th3了
    //此外，还可以使用function、bind的函数对象；线程的运行函数只要是可调用对象就行

    th1.join();
    th2.join();
    th3.join();
    th4.join();
    th5.join();
    th6.join();
    th7.join();
    th8.join();
    return 0;
}